package org.he.auth.service.impl;

import org.he.auth.dto.LoginDTO;
import org.he.auth.service.ILoginService;
import org.he.auth.vo.LoginVO;
import org.he.basic.data.ContextMap;
import org.he.org.domain.Employee;
import org.he.org.mapper.IEmployeeMapper;
import org.he.org.service.IEmployeeService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Objects;
import java.util.UUID;

/**
 * @author He
 * @date 2023/12/5  12:45
 */
@Service
public class LoginServiceImpl implements ILoginService {
    @Autowired
    private IEmployeeMapper employeeMapper;
    @Override
    public LoginVO login(LoginDTO loginDTO) {
        // 判断loginDTO里面的账号密码是否为空
        if (Objects.isNull(loginDTO.getUsername()) || Objects.isNull(loginDTO.getPassword())){
            throw new RuntimeException("账号或密码为空");
        }
        // 登录有两套方案
        // 账号密码一起查 直接返对象 通过对象是否为空 判断登录是否成功
        // 根据账号先查对象 再判断对象密码是够匹配 最后再返回结果 使用第二种方案,因为第一种方案有sql注入风险,而且无法判断到底是账号错误还是密码错误
        Employee employee = employeeMapper.queryByUsername(loginDTO);
        if (Objects.isNull(employee)){
            throw new RuntimeException("账号错误,请重新输入");
        }
        // trim()是用于去除字符串两端空白字符的方法 空白字符包括空格、制表符（\t）、换行符（\n）等
        if (!employee.getPassword().equals(loginDTO.getPassword().trim())){
            throw new RuntimeException("密码错误,请重新输入");
        }
        LoginVO loginVO = new LoginVO();
        // 数据脱敏
        Employee user = new Employee();
//        user.setAge(employee.getAge());
//        user.setUsername(employee.getUsername());
        BeanUtils.copyProperties(employee, user);
        user.setPassword("");
        user.setId(null);
        user.setDepartment(null);
        user.setEmail("");
        user.setHeadImage("");
        loginVO.setUser(user);
        String token = UUID.randomUUID().toString().replace("-", "");
        loginVO.setToken(token);
        // 存全局map 如果直接使用 employee 脱敏 那么你存在map中的数据就没有id了
        ContextMap.loginMap.put(token,employee);
        return loginVO;
    }
}
